home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / A86V402.ZIP / A14.DOC < prev    next >
Text File  |  1994-12-21  |  33KB  |  735 lines

  1. CHAPTER 14   DESCRIPTIONS OF A86 ERROR MESSAGES
  2.  
  3.  
  4. A86 signals successful assembly by returning an ERRORLEVEL of 0.
  5. If errors are detected during assembly, A86 returns an ERRORLEVEL
  6. of 1.  If undefined symbols remain at the end of assembly, A86
  7. returns an ERRORLEVEL of 2.
  8.  
  9. ERROR 01: Unknown Mnemonic
  10.  
  11.    Most assembly-language lines start with a built-in instruction
  12.    mnemonic such as MOV or ADD.  The only circumstances in which
  13.    a line can start with a non-built-in symbol are if the symbol
  14.    is a macro name or INT equate, or if the symbol is now being
  15.    defined, as indicated by a limited set of following symbols: a
  16.    colon, EQU, DB, DW, etc.  This line started with a
  17.    non-built-in symbol which did not fall into any of the above
  18.    categories.  You might have misspelled an instruction
  19.    mnemonic, or misspelled the following word.
  20.  
  21. ERROR 02: Jump > 128
  22.  
  23.    The destination operand of a conditional jump must be a label
  24.    within 128 bytes of the end of the instruction.  (Precisely,
  25.    from -128 to +127 from the next instruction, which is from
  26.    -126 to +129 from the start of the conditional jump.)  This
  27.    error can also occur from an unconditional JMP to a
  28.    forward-referenced local label, since A86 assumes the short
  29.    JMP form in that case.  This error is reported in three
  30.    possible places:
  31.  
  32.     1. At the jump.  The operand is more than 126 bytes before
  33.        the jump, or the operand is not a label (e.g. you tried an
  34.        indirect conditional jump through a variable, which isn't
  35.        allowed)
  36.  
  37.     2. At a label definition.  In this case, you use your editor
  38.        to search backwards for references to the label.  One or
  39.        more of the earliest conditional jumps found are too far
  40.        away.
  41.  
  42.     3. At a RET, RETF, or IRET instruction.  You use your editor
  43.        to search backwards for that flavor of RET used as the
  44.        operand to a conditional jump (the A86 conditional return
  45.        feature). The earliest such jumps not satisfied by a
  46.        previous RET are too far away.
  47.  
  48.    You usually correct this error by rearranging your code, or
  49.    (better) by breaking intervening code off into subroutines. If
  50.    desperate, you can replace "Jcond" with "IF cond JMP".
  51.  
  52. ERROR 03: [BX+BP] And [SI+DI] Not Allowed
  53.  
  54.    The 86 instruction set does not support the combinations of
  55.    indexing registers indicated in the error message.  In
  56.    previous versions of A86, this error was reported in other
  57.    illegal operand combinations; I've attempted to change other
  58.    cases to error 14.  If you ever find otherwise, please let me
  59.    know.
  60.                                                              14-2
  61.  
  62. ERROR 04: Bad Character In Number
  63.  
  64.    All numbers, and only numbers, start with a decimal digit.
  65.    (It's illegal to have a symbol begin with a digit; e.g.
  66.    01MYVAR .)   You have coded something that starts with a
  67.    decimal digit but does not have the correct format for a
  68.    numeric constant.  See Chapter 8 for detailed descriptions of
  69.    the formats of both integer and floating constants.
  70.  
  71. ERROR 05: Operands Not Allowed
  72.  
  73.    When this error is reported it usually means that you have
  74.    provided something more than just the mnemonic for an
  75.    instruction that does not have any operands: e.g., PUSHF,
  76.    STOSB, STC, FLDPI, CLTS.  It's also called in other contexts
  77.    when the assembler expects nothing more on the line; e.g.,
  78.    NAME with more than just a single name following, or something
  79.    following the word ENDS.
  80.  
  81. ERROR 06: Symbol Required
  82.  
  83.    This is reported in numerous situations where A86 requires
  84.    some sort of symbol: either a built-in assembler mnemonic, or
  85.    a symbol you define.  (It's possible that a number or some
  86.    punctuation marks are legal in the context, and that they have
  87.    already been checked for.)  Instead of a symbol, a punctuation
  88.    mark or out-of-context number was seen.  The contexts in which
  89.    this error can occur include:
  90.  
  91.     * the start of a line (characters hex 3C or greater)
  92.  
  93.     * after the following at the start of a line: a symbol you
  94.        define, #, #IF, IF, CODE, or DATA
  95.  
  96.     * where operands to the following directives are expected:
  97.        NAME, PUBLIC, EXTRN, GROUP, SEGMENT
  98.  
  99.     * after ">" denoting a local-label forward reference
  100.  
  101. ERROR 07: Local Symbol Required
  102.  
  103.    This is reported when something other than a generic local
  104.    label (letter followed by one or more digits) follows a ">"
  105.    mark, which denotes a local-label forward reference.  If you
  106.    meant "greater than" you use the GT operator instead.
  107.  
  108. ERROR 08: Too Many Operands
  109.  
  110.    This is reported for instructions and directives requiring a
  111.    limited number of operands, for which the limit is exceeded.
  112.    Since operands are separated by commas, you have too many
  113.    commas-- possibly an extra comma between the mnemonic and
  114.    first operand, or at the end of the operands.
  115.  
  116. ERROR 09: Constant Required
  117.                                                              14-3
  118.  
  119.    This is reported for instructions and directives (ENTER, RET,
  120.    RADIX, etc.) requiring operands that are an immediate constant
  121.    number; and for expression operators (*, /, SHL, OR, NOT, BY,
  122.    etc.) whose operands must be constant.  In some cases a
  123.    limited number of forms other than constants are acceptable,
  124.    but the assembler has already checked for and not found those
  125.    possibilities.
  126.  
  127. ERROR 10: More Operands Required
  128.  
  129.    This is reported for instructions requiring two operands, for
  130.    which you have provided no operands or only one operand.  You
  131.    might have left out the comma separating the operands.
  132.  
  133. ERROR 11: Constant/Label Not Allowed
  134.  
  135.    This is reported when you have given a constant number in a
  136.    place where it isn't allowed-- usually as a destination
  137.    operand to an instruction, such as the first operand to a MOV
  138.    or ADD.  If you meant the operand to be the memory location
  139.    with the constant offset, you must convert the type by
  140.    enclosing the operand in brackets [ ] or appending a
  141.    size-specifier (B, W, D, Q, or T) to the number.
  142.  
  143. ERROR 12: Segment Register Not Allowed
  144.  
  145.    This is reported when you have used a segment register in an
  146.    instruction where it isn't allowed.  The only instructions
  147.    allowing segment registers as operands are MOV, PUSH, and POP.
  148.    You can't, for example, ADD into a segment register.  If you
  149.    want to do anything with a segment register value, you have to
  150.    MOV it into a general register, perform the operation, then
  151.    MOV the result back to the segment register.
  152.  
  153. ERROR 13: Byte/Word Combination Not Allowed
  154.  
  155.    This is reported in a two-byte instruction in which one
  156.    operand is byte-sized and the other word-sized; or in an
  157.    instruction with a byte-sized destination and an immediate
  158.    source whose value is not byte-sized (high byte not 0 or 0FF).
  159.    If one of the operands is a memory variable of the wrong size,
  160.    you either change the declaration of the variable (DB to DW or
  161.    vice versa) or override the size of the variable in this
  162.    instruction only, by appending a " B" or " W" to the memory
  163.    operand.
  164.  
  165. ERROR 14: Bad Operand Combination
  166.  
  167.    This is reported when you attempt to add or combine terms in
  168.    an operand expression that do not allow combination.  An
  169.    example of this would be DT 3.7+BX.  Only constants can be
  170.    added to floating point numbers.
  171.  
  172.    This is also reported when you have two operands that are
  173.    mismatched in size, and the mismatch is something other than
  174.    Byte vs. Word. Example: MOV AL,D[0100].
  175.                                                              14-4
  176.  
  177. ERROR 15: Bad Subtraction Operands
  178.  
  179.    This is reported when you attempt to subtract terms in an
  180.    operand expression that do not allow subtraction, or if the
  181.    right-hand side to a subtraction is missing.  If the
  182.    right-hand side to a subtraction is a non-forward-referenced
  183.    constant, then the left side can be almost anything.
  184.    Otherwise, the operands must match; e.g., labels from
  185.    relocatable segments must be in the same segment (in which
  186.    case the answer is an absolute constant; namely, the size of
  187.    the block of memory between the two labels).
  188.  
  189. ERROR 16: Definition Conflicts With Forward Reference
  190.  
  191.    This error occurs when the assembler has previously guessed
  192.    the type of a forward-referenced symbol in order to determine
  193.    what kind of instruction to generate, and the guess turned out
  194.    to be wrong.  The error is reported at the time the symbol is
  195.    defined.  For example, when A86 sees MOV AX,FOO, it will
  196.    assume FOO is an immediate value.  This error is reported if
  197.    FOO turns out to be a word variable: FOO DW 0.  You need to
  198.    search backwards from the error message, to references of FOO,
  199.    and specify the type you intend to be used: MOV AX,FOO W.  If
  200.    you really did intend to load the offset of FOO and not the
  201.    memory contents, you can code MOV AX,OFFSET FOO to make the
  202.    error message go away.
  203.  
  204. ERROR 17: Divide Overflow
  205.  
  206.    This is reported when the right-hand side to a division or MOD
  207.    operation is zero, or when the result of a division by a large
  208.    (>64K) number is still large.
  209.  
  210. ERROR 18: Same Type Required
  211.  
  212.    This is reported when the two operands to a relational
  213.    operator (EQ, NE, GT, GE, LT, or LE) are of different types.
  214.    The operands to a relational operator ought to be both
  215.    absolute integer constants, or labels in the same segment.
  216.  
  217. ERROR 19: CS Destination Not Allowed
  218.  
  219.    This is reported if you attempt to specify CS as the
  220.    destination (first) operand to MOV, or as an operand to POP.
  221.    The only acceptable way to load CS on the 8086 is via a far
  222.    JMP, CALL, RETF, or IRET instruction.  The MOV and POP forms
  223.    don't make much sense, so they were outlawed by Intel.
  224.  
  225. ERROR 20: Left Operand Not Allowed
  226.  
  227.    This is reported if you have a left-hand side to an expression
  228.    operator that expects only a single operand to its right.
  229.    Those operators are BIT, NOT, OFFSET, TYPE, LOW, HIGH, SHORT,
  230.    LONG, and INT.  (The mnemonic INT is considered an operator
  231.    e.g., in MSDOS EQU INT 33.)  For example, you would get this
  232.    error for the expression 1 NOT 2.
  233.                                                              14-5
  234.  
  235. ERROR 21: Bad Single Operand
  236.  
  237.    This is reported if the operand is inappropriate for an
  238.    instruction INC, DEC, PUSH, POP, NOT, NEG, MUL, IMUL, DIV, or
  239.    IDIV, that takes a single operand.  You should look up the
  240.    instruction in the chart in Chapter 6, to determine the proper
  241.    operand forms allowed.
  242.  
  243. ERROR 22: Bad DUP Usage
  244.  
  245.    This is reported when a DUP construct occurs out of context
  246.    (e.g. in an instruction operand instead of a data
  247.    initialization); when the total number of bytes generated
  248.    would push the output pointer beyond 64K; or when there is
  249.    improper syntax for a DUP.  See Chapter 9 for the description
  250.    of correct DUP usage.
  251.  
  252. ERROR 23: Number Too Large
  253.  
  254.    This is reported when a numeric constant is too large for the
  255.    assembler to store in its operand buffers-- the limit for
  256.    integers is 2**80-1 = 1208925819614629174706175 decimal. The
  257.    error is also given when the exponent part of a floating point
  258.    constant is greater than 65535 in magnitude.
  259.  
  260. ERROR 24: SEGMENT or ENDS Required
  261.  
  262.    This is reported if a line beginning with one of the two A86
  263.    reserved symbols CODE or DATA does not continue with one of
  264.    the reserved symbols SEGMENT or ENDS.  If you meant CODE or
  265.    DATA to be a symbol you define, you have to change the name to
  266.    something else, like _CODE or _DATA.
  267.  
  268. ERROR 25: Bad CALL/JMP Operand
  269.  
  270.    This is reported if the operand to a call or jump instruction
  271.    cannot be taken as a jump destination.  This occurs if the
  272.    operand is missing, or if it has a size inappropriate for
  273.    address pointers: byte, quadword, or ten-byte.  The error also
  274.    occurs if the operand is a constant number, and you are
  275.    assembling to an OBJ format.  In OBJ format anything jumped to
  276.    within a segment must be specified as a label within some
  277.    segment.
  278.  
  279. ERROR 26: Memory Doubleword Required
  280.  
  281.    This is reported if the second operand to an LDS, LES, or
  282.    BOUND instruction is of the wrong type.  The operand should be
  283.    a doubleword memory quantity; but A86 will accept a word
  284.    memory variable or a memory variable of unspecified size.
  285.  
  286. ERROR 27: Bad IN/OUT Operand
  287.  
  288.    This is reported when the operands to IN or OUT do not have
  289.    the correct form.  See Chapter 6 for the limited set of forms
  290.    for these instructions.  One of the operands must be AL or AX;
  291.    the other must be DX or a constant between 0 and 255.
  292.                                                              14-6
  293.  
  294. ERROR 28: type Required
  295.  
  296.    This is reported when a symbol given in an EXTRN list is not
  297.    followed one of the type names B, W, D, Q, T, F, NEAR, or ABS.
  298.    The more verbose synonyms BYTE, WORD, DWORD, QWORD, and TBYTE
  299.    are also acceptable.
  300.  
  301. ERROR 29: Bad Rotate/Shift Operand
  302.  
  303.    This is reported when the count (second) operand to a rotate
  304.    or shift instruction is not appropriate: it should be either
  305.    the name CL or a constant less than 32.  The instructions
  306.    requiring this are ROL, ROR, RCL, RCR, SHL, SHR, SAL, SAR, and
  307.    the NEC-specific instructions SETBIT, TESTBIT, CLRBIT, and
  308.    NOTBIT.
  309.  
  310. ERROR 30: Byte-Sized Constant Required
  311.  
  312.    This is reported in contexts where only a byte-sized absolute
  313.    constant is acceptable.  Those contexts are: the operand to a
  314.    BIT or INT operator in an expression; the required operand to
  315.    an INT or CALL80 instruction; the optional operand to an AAM
  316.    or AAD instruction.
  317.  
  318. ERROR 31: Instruction In Data Segment Not Allowed
  319.  
  320.    There are only a limited number of directives allowed with a
  321.    STRUC or a DATA segment.  This error is reported when any
  322.    instructions or disallowed directives are seen in one of these
  323.    restricted environments.  You have possibly neglected to
  324.    provide an ENDS directive, returning you to normal assembly.
  325.    In a STRUC, the only directives allowed are DB, DW, DD, DQ,
  326.    DT, another STRUC, ENDS, EQU, SEGMENT, GROUP, MACRO, LABEL,
  327.    EVEN, and ORG.  The DATA segment allows the same directives,
  328.    plus PROC, ENDP, DATA, and CODE.
  329.  
  330. ERROR 32: Bad String
  331.  
  332.    This is reported when you start a quoted string, and do not
  333.    provide the closing quote in the same line.  You might have
  334.    left it out; or you might not have intended to code a string
  335.    at all, and accidentally inserted a single- or double-quote
  336.    mark within the string.  Or you might have intended a string
  337.    containing an end-of-line, which isn't allowed.  You must
  338.    instead close the string and code hex bytes 0D,0A to represent
  339.    an end-of-line.
  340.  
  341. ERROR 33: Bad Data Operand
  342.  
  343.    This is reported if an inappropriate operand is seen in a data
  344.    initialization (DB, DW, DD, DQ, or DT) directive.  Examples of
  345.    this are indexed quantities such as [BX], non-byte quantities
  346.    in a DB, or floating point constants in a DB or DW.
  347.  
  348. ERROR 34: Index Brackets Required
  349.                                                              14-7
  350.  
  351.    This is reported if the name of a register is given in an
  352.    addition/combination operation, but the register is not
  353.    enclosed in square brackets.  The only registers that may be
  354.    added are those presented as indexing registers.  For example,
  355.    don't code BX+2, code [BX+2].
  356.  
  357. ERROR 35: Bad Character
  358.  
  359.    This is reported when a punctuation mark or other non-standard
  360.    character is seen where it is not expected.  The characters
  361.    causing this error at the beginning of a line are digits, and
  362.    the marks  / - , + * ( ) & " !   --  other illegal marks at
  363.    the start of a line cause error 6, Symbol Required.  The
  364.    characters causing this error elsewhere (i.e. within operands)
  365.    are all characters except letters, digits, and the marks [ ] +
  366.    - ' " > ( ) * . / :
  367.  
  368. ERROR 36: String > 2 Not Allowed
  369.  
  370.    This is reported when a string with 3 or more characters is
  371.    seen outside of the places where such a string is allowed (in
  372.    a DB directive, macro operand, or relocatable SEGMENT
  373.    directive).  One- and two-character strings are treated as
  374.    simple numeric constants; but longer strings require special
  375.    handling and are allowed only in the places mentioned.
  376.  
  377. ERROR 37: Misplaced Built-In Symbol
  378.  
  379.    The symbol just before this error message is an A86 built-in
  380.    symbol, that is in a place where it doesn't belong.  Examples
  381.    of this are: mnemonics such as MOV occurring in operands; and
  382.    symbols that aren't mnemonics such as LT occurring at the
  383.    start of the line.  If you thought you could define the symbol
  384.    to the left of this message for your own use, you were wrong.
  385.    You need to change the symbol to something else: TEST to
  386.    _TEST, for example.  If you'd like to know the built-in
  387.    meaning of the symbol, you can look it up in Chapter 16.
  388.  
  389. ERROR 38: Segment Combination Not Allowed
  390.  
  391.    This is reported when you attempt to add or combine a segment
  392.    or group name with another quantity.  A86 currently doesn't
  393.    allow this.
  394.  
  395. ERROR 39: Bad Index Register
  396.  
  397.    This is reported when you attempt to use a register other than
  398.    SI, DI, BX, or BP for indexing.  Those are the only registers
  399.    that the 86 architecture allows you to place inside brackets,
  400.    to address memory.
  401.  
  402. ERROR 40: Conflicting Multiple Definition Not Allowed
  403.                                                              14-8
  404.  
  405.    This is reported when you define a symbol in two places in
  406.    your program, and the definitions aren't the same.  Most often
  407.    you have simply forgotten you already had a symbol somewhere
  408.    of the same name, and you need to change the name of one of
  409.    the two symbols you've defined.  A86 allows the re-use of a
  410.    symbol if it is a generic local label (a letter followed by
  411.    one or more digits), or if is defined with = instead of EQU.
  412.    A86 also allows the redefinition of a symbol if it has exactly
  413.    the same value (e.g. ESC EQU 01B in two places in your
  414.    program).  See the section "Duplicate Definitions" in Chapter
  415.    9 for a detailed discussion of this feature.
  416.  
  417. ERROR 41: ENDS Has No Segment
  418.  
  419.    This error occurs when A86 is assembling to an OBJ file, and
  420.    it sees an ENDS at the outermost level of segments-- the ENDS
  421.    has not been preceded by a matching SEGMENT directive.  You
  422.    need to look over your SEGMENT and ENDS directives, to get
  423.    them to match up properly.
  424.  
  425. ERROR 42: Bad IF Operand
  426.  
  427.    This is reported when an IF is not followed by one of the
  428.    flag-mnemonics (e.g., E, Z, NC, AE, etc.) that follow "J" in a
  429.    conditional jump instruction.  Most likely the line is a
  430.    conditional assembly line intended for another assembler.  In
  431.    A86, conditional assembly lines begin with a hash sign #.  So
  432.    you change IF, ELSE, ENDIF to #IF, #ELSE, #ENDIF.  You may
  433.    also need to change the condition following IF: IF FOO EQU 0
  434.    becomes #IF !FOO; IFDEF FOO becomes simply #IF FOO. IF
  435.    (expression) must be replaced by the two lines C1 EQU
  436.    (expression) followed by #IF C1 .  See Chapter 11 for the
  437.    details of A86's syntax for conditional assembly.  See Chapter
  438.    5 for the way A86 uses IF when it doesn't have a hash sign #.
  439.  
  440. ERROR 43: Parenthesis/Bracket Mismatch
  441.  
  442.    This is reported when there is a lack of balance of
  443.    parentheses ( ) or brackets [ ] in an operand expression--
  444.    there are too many left-sides, too many right-sides, or the
  445.    brackets are interleaved illegally: ( [ ) ].  Most likely you
  446.    have left out an opening or closing parenthesis/bracket in a
  447.    complicated expression; or a spurious extra ( ) [ or ] has
  448.    crept into your code.
  449.  
  450. ERROR 44: Bad Forward Reference Combination
  451.  
  452.    This is reported when you try to use forward references in
  453.    expressions that are too complicated for A86 to handle.  You
  454.    can add or subtract constants from forward-referenced symbols;
  455.    but you can't subtract a forward-referenced symbol from
  456.    anything, and you can't add two forward references together.
  457.    You can typically get around restrictions in forward reference
  458.    expressions by moving the expression down to an EQU directive
  459.    after the point that the symbols are defined, and making a
  460.    forward reference to the EQUated symbol that represents the
  461.    evaluated expression.
  462.                                                              14-9
  463.  
  464.    You will often get this error if you forget to put a
  465.    semi-colon before a comment: A86 will interpret your prose as
  466.    the addition of undefined (i.e., forward-referenced) terms.
  467.  
  468.    This error is also reported in some situations involving
  469.    relocatable symbols in OBJ mode -- these symbols are forward
  470.    references in the sense that they are resolved only at link
  471.    time.
  472.  
  473. ERROR 45: Is It Byte Or Word?
  474.  
  475.    This is reported when you have a memory operand of unspecified
  476.    size, and A86 needs to know whether the operand is byte-sized
  477.    or word-sized, in order to generate the correct instruction
  478.    form.  All you need to do is to append a B or a W to the
  479.    operand, to specify the size you want.  For example, if you've
  480.    coded INC [BX], you need to decide between INC B[BX] and INC
  481.    W[BX].  If you've coded ADD FOO,4 where FOO is a forward
  482.    reference, you need to specify ADD FOO B,4 or ADD FOO W,4 .
  483.  
  484. ERROR 46: Bad #-Construct
  485.  
  486.    This is reported if, within a macro definition, a # is seen
  487.    that is not followed by one of the allowed macro parameter
  488.    constructs described in Chapter 11.  Even in quoted strings,
  489.    the hash sign # must be literalized via ## if it is to be
  490.    taken as-is.
  491.  
  492.    If you mistakenly provide a macro-loop variable (#W, #X, #Y,
  493.    or #Z) outside of any loop defining that variable, this error
  494.    is detected when the macro is expanded, even though the error
  495.    is in the macro definition.
  496.  
  497.    The error is also reported if # occurs at the beginning of a
  498.    line, and is not followed by IF, ELSEIF, ELSE, or ENDIF; or if
  499.    a conditional assembly parameter is a built-in mnemonic e.g.
  500.    #IF MOV .  See Chapter 11 for the correct usage of the hash
  501.    sign in both macros and conditional assembly.
  502.  
  503. ERROR 47: #ENDIF Required
  504.  
  505.    This is reported if you have an #IF without a corresponding
  506.    #ENDIF before the end of the file (or the end of the macro
  507.    expansion if the #IF was assembled during a macro expansion).
  508.    When this message appears at the end of a file, you need to
  509.    search backwards for #IFs, to find the unclosed block.
  510.  
  511. ERROR 48: #EM Required To End Macro
  512.  
  513.    This is reported if you have a MACRO without an end.  In A86,
  514.    the end of a macro is given by #EM.  Most likely your file was
  515.    written for another assembler, and you need to convert macro
  516.    definitions.  You need to change all ENDM directives to #EM.
  517.    You also need to eliminate the named parameters from the MACRO
  518.    line, and replace occurrences of the named parameters with #1,
  519.    #2, #3, etc.  The & concatenation operator can be dropped. See
  520.    Chapter 11 for a full description of A86's macro syntax.
  521.                                                             14-10
  522.  
  523. ERROR 49: End Delimiter to COMMENT Required
  524.  
  525.    This is reported when the portion of code skipped in a COMMENT
  526.    directive has run to the end of the file, without the closing
  527.    delimiter being found.  You need to search backwards from the
  528.    end of the file to find the COMMENT directive, figure out
  529.    where you intend the directive to end, and duplicate the
  530.    delimiter (the first non-blank following COMMENT) at that
  531.    end-point.  See Chapter 4 for a full description of the
  532.    COMMENT directive.
  533.  
  534. ERROR 50: Reg,Mem Required
  535.  
  536.    This is reported when you have an improper combination of
  537.    operands for a MOV, XCHG, or general arithmetic instruction
  538.    such as ADD, SUB, CMP, XOR, etc.  Most often you have
  539.    attempted to provide two memory operands: MOV VAR1,VAR2 or ADD
  540.    VAR1,VAR2.  One of the operands must be a register.  You can
  541.    effect the memory-to-memory operation by using a register in a
  542.    two-instruction sequence; for example, MOV AX,VAR2 followed by
  543.    ADD VAR1,AX .  For convenience, A86 lets you code the sequence
  544.    with the single line ADD VAR1,AX,VAR2.
  545.  
  546.    If you don't wish to clobber the contents of any registers,
  547.    and the operands are word-sized, you may PUSH the source
  548.    operand and then POP to the destination operand: PUSH VAR2
  549.    followed by POP VAR1.
  550.  
  551. ERROR 51: Segment Override Not Allowed Here
  552.  
  553.    For compatibility with other assemblers, A86 allows segment
  554.    override operators CS:, DS:, ES:, or SS: within expressions in
  555.    instruction operands.  The override informs the assembler that
  556.    the named segment register is to be used for the memory
  557.    reference, so that the assembler might generate a segment
  558.    override opcode byte.  This error is reported when a segment
  559.    override operator occurs out of context: in A86's special
  560.    three-operand form for MOV or arithmetic instructions; within
  561.    a DATA segment or STRUC, or in an EQU directive.  You might
  562.    encounter the last case if you're porting a program written
  563.    for another assembler.  If so, you might have to provide
  564.    explicit overrides wherever the EQUated symbol is used.  It's
  565.    possible, though, that the override is provided only to
  566.    satisfy the other assembler's segment checking mechanism, and
  567.    no overrides are generated at all.  In that case, you can just
  568.    eliminate the override operator.
  569.  
  570. ERROR 52: Byte Operand Required
  571.  
  572.    This is reported when an operand to one of the NEC-specific
  573.    instructions STOBITS, LODBITS, ROL4, ROR4 is of the wrong
  574.    type.  STOBITS and LODBITS require the first operand to be a
  575.    byte-sized register and the second operand to be either a
  576.    byte-sized register or an immediate constant.  ROL4 and ROR4
  577.    require the only operand to be a byte-sized register.
  578.  
  579. ERROR 53: Word Register Required
  580.                                                             14-11
  581.  
  582.    This is reported when the first operand to any of the
  583.    instructions LDS, LES, LEA, BOUND, IMUL, LAR, or LSL is not a
  584.    word-sized general register (AX,BX,CX,DX,SI,DI,BP, or SP).
  585.  
  586. ERROR 54: Floating-Point Chip Required
  587.  
  588.    This is reported when you attempt to assemble a program with
  589.    floating point constants or floating point expressions, and
  590.    you do not have a floating point chip (8087 or 287) in your
  591.    computer system.  A86 uses the 87 to assemble constants and do
  592.    arithmetic.  It's time for you to buy a chip and install it in
  593.    that empty socket!
  594.  
  595. ERROR 55: Bad Floating-Point Operand
  596.  
  597.    This is reported when an operand to a floating point
  598.    instruction is not of the correct type.  See Chapter 7 for the
  599.    correct forms for the instruction you're coding.  Some
  600.    possibilities for the error are:
  601.  
  602.    * a memory operand has unspecified size, or a size not
  603.      compatible with the instruction.  Integer instructions
  604.      (FIxxx) require a W or D operand; floating arithmetic
  605.      instructions require a D or Q operand.
  606.  
  607.    * you've tried to specify an 86 register instead of a memory
  608.      operand.
  609.  
  610.    * you've tried A86's special FLD (constant) form in OBJ mode.
  611.      Sorry, I support this only for COM mode (mainly for D86).
  612.  
  613.    * you've specified two register numbers (0 through 7), but
  614.      neither is 0.
  615.  
  616.    * you've tried one of the disallowed forms FCOM i,0 or FCOMP
  617.      i,0
  618.  
  619. ERROR 56: Constant 0--7 Required
  620.  
  621.    This is reported if a constant number operand to an 87
  622.    instruction, which is supposed to represent an 87 stack number
  623.    (0 through 7), does not have the right value; i.e., it's not
  624.    an integer, or it's not in the range 0 through 7.
  625.  
  626. ERROR 57: Memory Operand Required
  627.  
  628.    This is reported when an operand to a floating-point or a 286
  629.    protected-mode instruction must be a memory operand, and the
  630.    operand you've provided isn't one.  See Chapters 7 (for
  631.    floating) or 6 (for protected) for the correct syntax of the
  632.    instruction you're coding.
  633.  
  634. ERROR 58: Segment Or Struc Name Not Allowed
  635.                                                             14-12
  636.  
  637.    This error occurs most often when you are attempting to
  638.    assemble as a COM program a file intended to be an EXE
  639.    program.  The COM format does not allow you to refer to the
  640.    value of a named segment, or to make a FAR pointer out of a
  641.    label within the program.  You should either use the +O option
  642.    to produce an OBJ file, or simply eliminate the statements
  643.    intended to set the segment registers-- COM programs are
  644.    started with all segment registers already pointing to the
  645.    same value.
  646.  
  647.    This error is also reported when you provide the name of a
  648.    structure, or the name of an INT equate, in a place where a
  649.    register or memory operand is expected.
  650.  
  651. ERROR 59: Word Operand Required
  652.  
  653.    This is reported when something other than a word-sized
  654.    operand is provided for one of the 286 instructions ARPL,
  655.    SLDT, LLDT, STR, LTR, VERR, VERW, SMSW, or LMSW.
  656.  
  657. ERROR 60: Circular Definition Not Allowed
  658.  
  659.    This is reported when a chain of macro calls or references to
  660.    undefined symbols reaches a depth of 1024.  A86 assumes that
  661.    it is in an infinite loop: for example, FOO EQU FOO; or BAZ
  662.    MACRO containing an uncontrolled call to BAZ within itself.
  663.  
  664.  
  665. ERROR 61: Overlapping Local Not Allowed
  666.  
  667.    Recall from Chapter 5 that when you use a local label symbol
  668.    twice, you must distinguish a reference to that symbol by
  669.    prepending a > before the symbol's name if the reference is a
  670.    forward reference.  You get this error if you have followed
  671.    such a forward reference with another reference, without the
  672.    >, before the next incaration of the symbol is defined.
  673.    There's a danger that you intended the reference to be to the
  674.    previous incarnation, which A86 doesn't allow. Example:
  675.  
  676.        L1:            ; first incarnation of L1
  677.             JNZ >L1   ; reference to second incarnation
  678.             JMP L1    ; ERROR-- which incarnation are we referring to?
  679.        L1:            ; second incarnation of L1
  680.  
  681.    If you intended the JMP to be to the second L1, you should
  682.    prepend a > to the L1, just like the JNZ.  If you intended the
  683.    JMP to be to the first L1, you must change one of the two
  684.    label names so that their ranges don't overlap.
  685.  
  686. ERROR 62: Instruction Not Allowed On Your CPU
  687.                                                             14-13
  688.  
  689.    This is reported when you attempt to assemble an instruction
  690.    not supported for the processor (8086/8088, 186, 286 or later,
  691.    or NEC) for which you are assembling.  The instructions not
  692.    common to all 86 processors are marked with a # or a * in
  693.    Chapter 6.  See Chapter 3 for the discussion of the P switch,
  694.    that allows you to specify the processor for which you are
  695.    assembling.
  696.  
  697. ERROR 97: Object Overflow
  698.  
  699.    This is reported when the assembler runs out of room in its
  700.    output object-code segment (which also holds records used to
  701.    resolve forward references).  This will happen only if your
  702.    object output nears the object capacity, which is 64K if a
  703.    full amount of memory (about 300K) is available to the
  704.    assembler.  If you have a limited amount of memory, you should
  705.    increase the memory available to A86, by buying another board,
  706.    or by having fewer memory-resident programs installed when you
  707.    run A86.  If you are assembling OBJ files, you can break the
  708.    program into smaller assembled modules.
  709.  
  710.    It's conceivable that this error could result in a D86
  711.    session, when you are using patch-memory mode to type in an
  712.    extremely complicated program.  In that case, you should type
  713.    the program into a text file instead, and use A86 to assemble
  714.    the text file.
  715.  
  716. ERROR 98: Undefined Symbol Not Allowed
  717.  
  718.    This error should occur only during a D86 debugging session,
  719.    when you type an immediate-execution assembly language line
  720.    containing a symbol not in the table (typically a mistyping on
  721.    your part).  D86 allows you to add symbols to the table only
  722.    when you are in patch-memory mode (reached by pressing the F7
  723.    key).
  724.  
  725. ERROR 99: Symbol Table Overflow
  726.  
  727.    This is reported when the symbol table runs out of space. It's
  728.    unlikely that you'll ever run into this error, since A86's
  729.    capacity is thousands of symbols.  If you do, you'll need to
  730.    reduce the number of symbols in your program.  One way to do
  731.    so is to replace all place-marker symbols with local labels in
  732.    a limited range (like L0--L9).  See Chapter 5 for a
  733.    description of A86's local label facility.
  734.  
  735.